home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / lang / c-part1 / 3200 < prev    next >
Encoding:
Text File  |  1996-08-05  |  1.7 KB  |  83 lines

  1. Path: atglab.bls.com!Alun.Champion
  2. From: Alun.Champion@bridge.bst.bls.com (Alun Champion)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: Can a function return a (pointer to a) function?
  5. Date: 26 Jan 1996 23:14:42 GMT
  6. Organization: Computer People Inc.
  7. Message-ID: <ALUN.CHAMPION.96Jan26181442@g7240065.bridge.bst.bls.com>
  8. References: <4ebaaa$jh6@barnacle.iol.ie>
  9. NNTP-Posting-Host: bstfirewall.bst.bls.com
  10. In-reply-to: "John D. Hourihane"'s message of 26 Jan 1996 19:33:30 GMT
  11.  
  12. In article <4ebaaa$jh6@barnacle.iol.ie> "John D. Hourihane" <hourihaj@iol.ie> writes:
  13.  
  14. : I am trying to write a function which will return a pointer to a function,
  15. : but I'm having no luck.
  16.  
  17. Your problem lies in the declaration of the function.
  18.   (int f(int, int)) *pick(int s);
  19. It's a very logical attempt but unfortunately not quite right.
  20. It should have been:
  21.   int (*pick(int s))(int,int);
  22.  
  23. I would look on the net for a utility called cdecl, it will explain these
  24. complication declarations for you.
  25.  
  26. Typedefs are very good for this sort of thing and makes things a lot
  27. simpler to understand:
  28.  
  29.   typedef int (*FuncPtr)(int, int);
  30.   FuncPtr pick(int s);
  31.  
  32. Here's your code corrected:
  33.  
  34. #include <stdio.h>
  35.  
  36. #define ADD 0
  37. #define MULTIPLY 1
  38.  
  39. typedef int (*FuncPtr)(int, int);
  40.  
  41. FuncPtr pick(int s);
  42.  
  43. int
  44. main(void)
  45. {
  46.     printf("5 + 4 = %d\n", pick(ADD)(5,4));
  47.     printf("5 * 4 = %d\n", pick(MULTIPLY)(5,4));
  48.  
  49.     return 0;
  50. }
  51.  
  52. int
  53. add(int x, int y)
  54. {
  55.     return x + y;
  56. }
  57.  
  58. int
  59. multiply(int x, int y)
  60. {
  61.     return x * y;
  62. }
  63.  
  64. FuncPtr pick(int s)
  65. {
  66.     switch (s) {
  67.     case ADD:
  68.         return add;
  69.     case MULITPLY:
  70.         return multiply;
  71.     }
  72.  
  73.     return 0;
  74. }
  75.  
  76. Hope this helps
  77.  
  78. Regards
  79.  
  80.    -A.
  81. -- 
  82. | A.Champion                |
  83.